home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fatted Calf
/
The Fatted Calf.iso
/
Applications
/
Communication
/
NewsBase
/
Source
/
kanjiconv.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-12
|
6KB
|
261 lines
/* kconv.c - Japanese code converter
between two of EUC, JIS, and Shift-JIS code.
written by K.Handa 89.5.25 */
/*
* modified by K.Miyai, ISR 1991.Dec.24
*/
#include <streams/streams.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
int i1, i2;
int c1, c2;
int kanjiconv();
int j2e_conv();
int e2j_conv();
int e2j_conv_adj();
int e2e_adj();
#define ESC_CODE 033
#define TOK1 '$'
#define TOK2 'B'
#define TOA1 '('
#define TOA2 'J'
#define MAXLEN_LINE 500
/* 507 is supposed to be a maximum for nntp, but doesn't work */
/* #define TEST */
#ifdef TEST
int
main(int argc, char **argv)
{
char conv_func[32];
int conv_flag;
NXStream *in, *out;
int stdInFileDesc, stdOutFileDesc;
/* input stream */
if (argc ==1 || argc > 3) {
fprintf(stderr, "Usage: kanjiconv -j/-e/-c/-a [filename]\n");
} else if (argc == 2) {
stdInFileDesc = fileno(stdin);
in = NXOpenFile(stdInFileDesc, NX_READONLY);
} else if ((in = NXMapFile((char *)*(argv+2), NX_READONLY)) == NULL) {
fprintf(stderr,"can not open file %s\n", *(argv+2));
return (-1);
}
/* output stream */
stdOutFileDesc = fileno(stdout);
out = NXOpenFile(stdOutFileDesc, NX_WRITEONLY);
/* call kanji converter */
++argv;
if ((char)**argv != '-') {
fprintf(stderr," invalid option\n");
}
switch ((char)*(*argv+1)) {
case 'e':
kanjiconv("jis_to_euc", in, out);
case 'j':
kanjiconv("euc_to_jis", in, out);
case 'c':
kanjiconv("euc_to_jis_adjustline", in, out);
default:
kanjiconv("euc_to_euc_adjustline", in, out);
}
NXClose(in); NXClose(out);
return(0);
}
#endif TEST /*TEST*/
int
kanjiconv (char *conv_option, NXStream *fin, NXStream *fout)
{
if (strcmp(conv_option,"jis_to_euc") == 0)
j2e_conv(fin, fout);
else if (strcmp(conv_option,"euc_to_jis") == 0)
e2j_conv(fin, fout);
else if (strcmp(conv_option,"euc_to_jis_adjustline") == 0)
e2j_conv_adj(fin, fout);
else if (strcmp(conv_option,"euc_to_euc_adjustline") == 0)
e2e_adj(fin, fout);
else
return (-1);
return 0;
}
int
j2e_conv (NXStream *fin, NXStream *fout)
{
int kanji = 0;
while ((char)(i1 = NXGetc(fin)) != EOF) {
if (kanji) {
if (i1 == ESC_CODE) {
if ((i1 = NXGetc(fin)) == TOA1) {
NXGetc(fin);
kanji = 0;
} else {
NXPutc(fout,ESC_CODE);
NXUngetc(fin);
}
} else if (0x21 <= i1 && i1 <= 0x7e) {
c1 = i1 | 0x80;
c2 = NXGetc(fin) | 0x80;
NXPutc(fout, c1); NXPutc(fout, c2);
} else
NXPutc(fout, i1);
} else {
if (i1 == ESC_CODE) {
if ((i1 = NXGetc(fin)) == TOK1) {
NXGetc(fin);
kanji = 1;
} else {
NXPutc(fout, ESC_CODE);
NXUngetc(fin);
}
} else
NXPutc(fout, i1);
}
}
return (0);
}
int
e2j_conv(NXStream *fin, NXStream *fout)
{
int kanji = 0;
while ((char)(i1 = NXGetc(fin)) != EOF) {
if (kanji) {
if (i1 & 0x80) {
c1 = i1 & 0x7f; c2 = NXGetc(fin) & 0x7f;
NXPutc(fout,c1); NXPutc(fout,c2);
} else {
NXPutc(fout,ESC_CODE); NXPutc(fout,TOA1); NXPutc(fout,TOA2);
NXPutc(fout,i1);
kanji = 0;
}
} else {
if ((i2=NXGetc(fin)) == EOF) {
NXPutc(fout, i1);
break;
} else if ((i1 & 0x80) && (i2 & 0x80)) {
NXPutc(fout,ESC_CODE); NXPutc(fout,TOK1); NXPutc(fout,TOK2);
c1 = i1 & 0x7f; c2 = i2 & 0x7f;
NXPutc(fout,c1); NXPutc(fout,c2);
kanji = 1;
} else {
NXUngetc(fin);
NXPutc(fout,i1);
}
}
}
return (0);
}
int
e2j_conv_adj(NXStream *fin, NXStream *fout)
{
int kanji = 0;
unsigned int length = 0;
int adj_flag = 0;
while ((char)(i1 = NXGetc(fin)) != EOF) {
if (i1 == '\n') {
/* reset counting */
length = 0;
}
if (length > MAXLEN_LINE) {
/* now i1 is next to MAXLEN_LINE */
if (kanji) {
NXUngetc(fin);
/* end this line*/
NXPutc(fout,ESC_CODE); NXPutc(fout,TOA1); NXPutc(fout,TOA2);
NXPutc(fout,'\r'); NXPutc(fout,'\n');
/* start next line*/
NXPutc(fout,ESC_CODE); NXPutc(fout,TOK1); NXPutc(fout,TOK2);
length = 0;
} else {
NXUngetc(fin);
NXPutc(fout,'\r'); NXPutc(fout,'\n');
length = 0;
}
adj_flag = 1;
continue;
}
if (kanji) {
if (i1 & 0x80) {
c1 = i1 & 0x7f; c2 = NXGetc(fin) & 0x7f;
NXPutc(fout,c1); NXPutc(fout,c2);
length += 2;
} else {
NXPutc(fout,ESC_CODE); NXPutc(fout,TOA1); NXPutc(fout,TOA2);
NXPutc(fout,i1);
kanji = 0;
length += 4;
}
} else {
if ((i2=NXGetc(fin)) == EOF) {
NXPutc(fout, i1);
length += 1;
break;
} else if ((i1 & 0x80) && (i2 & 0x80)) {
NXPutc(fout,ESC_CODE); NXPutc(fout,TOK1); NXPutc(fout,TOK2);
c1 = i1 & 0x7f; c2 = i2 & 0x7f;
NXPutc(fout,c1); NXPutc(fout,c2);
kanji = 1;
length += 5;
} else {
NXUngetc(fin);
NXPutc(fout,i1);
length += 1;
}
}
}
return adj_flag;
}
int
e2e_adj(NXStream *fin, NXStream *fout)
{
unsigned int length = 0;
int adj_flag = 0;
while ((char)(i1 = NXGetc(fin)) != EOF) {
if (i1 == '\n') {
/* reset counting */
length = 0;
}
if (length > MAXLEN_LINE) {
/* now i1 is next to MAXLEN_LINE */
NXUngetc(fin);
/* end this line*/
NXPutc(fout,'\r'); NXPutc(fout,'\n');
length = 0;
adj_flag = 1;
continue;
}
if (i1 & 0x80) {
if ((i2=NXGetc(fin)) && 0x80) {
/* i1:i2 is kanji, so put out the pair */
NXPutc(fout,i1); NXPutc(fout,i2);
} else {
NXUngetc(i2);
NXPutc(fout,i1);
}
} else {
NXPutc(fout,i1);
}
}
return (adj_flag);
}